# 6 字典 dictionary (键值对)
# 使用花括号 {} 表示
alien_0 = {'color': 'green', 'points': 5}
print(alien_0['color'])

# 增删改
# 增
alien_0['x_position'] = 10
alien_0['y_position'] = 25
print(f"alien_0: {alien_0}")

# 改
alien_0['color'] = 'yellow'
print(alien_0['color'])

# 删
del alien_0['points']
print(f'alien_0: {alien_0}')

print()

# 访问
# get(): 可以设置默认值
print('get(): 可以设置默认值')
print(alien_0.get('color'))
print(alien_0.get('point', 'No point value assigned.'))
# 没有设置默认值，将返回None
print(alien_0.get('point'))

print()

# 遍历 —— 使用 alien_0.items()
print('key-value 遍历:')
for key, value in alien_0.items():
    print(f'{key} : {value}')

print()

# 遍历键
print('key 遍历：')
for key in alien_0.keys():
    print(f"key: {key}")

print()

# keys() 并非直接的列表，若要返回列表值还需调用list函数
key_list = alien_0.keys()
print('key()返回的变量类型：', type(key_list), '是一个视图对象(view object)')
print()
# 视图对象不是列表，不支持索引，可以使用 list() 来转换为列表。
print("直接打印：", key_list)
print(f"转换为列表形式为: {list(key_list)}")

print()

# 集合set —— 使用花括号{}定义
language_dict = {
    'person_A': 'Python',
    'person_B': 'Java',
    'person_C': 'C++',
    'person_D': 'Python',
}
print("字典中的所有值: %s" % language_dict.values())
print("使用set对所有值去重: %s" % set(language_dict.values()))

# 嵌套
user = {
    'Tom': {
        'first': 'goku',
        'last': 'sun',
        'location': 'earth'
    },
    'Jerry': {
        'first': 'lin',
        'last': 'ku',
        'location': 'earth'
    },
    # 字典最后的元素结尾可以添加逗号“,”
}
for user_name, user_info in user.items():
    print(f"\nUserName: {user_name}")
    fullname = f"{user_info['first']} {user_info.get('last')}"
    location = user_info['location']

    print(f"\tFull name: {fullname}")
    print(f"\tLocation: {location}")
